# -*- coding: utf-8 -*-
from contrib import utility#,logger

class OperationAop(type):
    '''
    初始化metaclass的函数，这个函数最重要的就是第四个参数，dict通过这个参数我们可以修改类的属性（方法）
    '''
    def __new__(mcl,name,bases,dict):
        #加载类型模块的FunctionType
        from types import FunctionType 
        #定义一个空对象的变量
        obj = object() 
        '''
        这个就是要植入的方法，func参数就是我们要调用的函数
        '''
        def aop(func):
            '''
            我们用这个函数来代替将要调用的函数
            '''
            def wrapper(*args, **kwds):
                if func.__name__ == "__init__":
                    return func(*args, **kwds)
                if func.__name__.startswith("__"):#私有方法不作异常处理
                    #logger.debug("Private Function Name:" + func.__name__)
                    return func(*args, **kwds)
                #logger.debug("Function Name:" + func.__name__)
                try:
                    #logger.debug("try begin")

                    #logger.debug(args)
                    #logger.debug(kwds)

                    value = func(*args, **kwds) #调用本来要调用的函数
                    #logger.debug(value)
                    
                    response = utility.jsonDump(True, None, value)
                    #logger.debug(response)
                    #logger.debug("try end")
                    return response #返回
                except Exception, e:
                    #logger.error(e)
                    response = utility.jsonDump(False, str(e), None)
                    return response

                
            return wrapper
        #在类的成员列表中查找即将调用的函数
        for attr, value in dict.iteritems():
            if isinstance(value, FunctionType):
                dict[attr] = aop(value) #找到后用aop这个函数替换之
        obj = super(OperationAop, mcl).__new__(mcl, name, bases, dict) #调用父类的__new__()创建self
        return obj